package cn.tedu.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**本类用于注解的学习--自定义注解*/
public class TestAnnotation {
}
//2.通过@Target注解标记自定义注解可以使用的位置
@Target({ElementType.METHOD,ElementType.TYPE})
/**3.通过@Target元注解规定自定义注解可以使用的位置
 * 我们使用"ElementType.静态常量"的方式来指定自定义注解具体可以加在什么位置
 * 而且，这里的值可以写多个，格式:@Target({ElementType.xx1,ElementType.xx2})*/
//3.通过@Retention注解标记自定义注解的生命周期
    @Retention(RetentionPolicy.RUNTIME)//到运行时都有效
    /**4.通过@Retention元注解规定自定义注解的生命周期
     * 我们使用"RetentionPolicy.静态常量"的方式来指定自定义注解具体的生命周期
     * 注意:这个值只能写一个SOURCE CLASS RUNTIME 3选1*/
//1.定义自定义注解
/**1.首先注意:注解定义的语法与Java不同
 * 2.定义自定义注解的格式:@interface 注解名*/
@interface Rice{
    //5.我们可以给注解进行功能增强--添加注解的属性
    /**5.int age();不是方法的定义，而是给自定义注解添加了一个age属性*/
//    int age();//给Rice注解添加了一个普通的int类型的age属性
    int age() default 0;//给普通属性age赋予默认值0
    //6.给自定义注解添加特殊属性value
    /**自定义注解中还可以添加特殊属性value
     * 特殊属性的定义方式与赋予默认值的方式和普通属性一样
     * 但注意:特殊属性的名字必须是value,类型不作限制*/
//    String value();//定义一个特殊属性value,类型是String
    String value() default "lemon";//定义一个特殊属性value,类型是String
}
//@Rice
class TestAnno{
    /**测试1:本别给TestAnno类/name属性/eat方法添加Rice注解*/
//    @Rice
      /**结论:属性上的注解报错了，说明自定义注解可以加在什么位置，由@Target决定*/
    String name;
    /**测试2:当我们给Rice注解添加了一个age属性以后，@Rice注解使用时直接报错
     * 结论:当注解没有定义属性时，可以直接使用
     *      当注解定义了属性以后，必须给属性赋值,格式: @Rice(age = 10)*/
    /**测试3:给age属性赋予默认值以后，就可以直接使用Rice注解了
     * 不需要给age属性赋值，此时age属性的值就是默认值0*/
    /**测试4:给Rice注解添加了特殊属性value以后，必须给属性赋值
     * 只不过特殊属性赋值时可以简写成:@Rice("Apple")*/
    /**测试5:如果特殊属性也赋予了默认值，那么可以不赋值直接使用注解
     * 但是如果想要给注解的所有属性赋值，每条赋值语句包括特殊属性,都不可以简写*/
//    @Rice(age = 10)
//    @Rice
//    @Rice("Apple")
//    @Rice//不报错，因为我们定义了两个属性，但两个属性都有默认值
    @Rice(age=10,value="banana")
    public void eat(){
        System.out.println("一会就干饭");
    }
}